package py.com.alfa.escriba.web.services.impl;

import java.util.Date;
import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;

import py.com.alfa.escriba.exception.ErrorCode;
import py.com.alfa.escriba.exception.ServiceException;
import py.com.alfa.escriba.persistence.dao.ControlesDAO;
import py.com.alfa.escriba.persistence.dao.ControlesseguimientoDAO;
import py.com.alfa.escriba.persistence.dto.ControlesDTO;
import py.com.alfa.escriba.persistence.dto.ControlesseguimientoDTO;
import py.com.alfa.escriba.util.Utils;
import py.com.alfa.escriba.web.interceptor.InvocationContext;
import py.com.alfa.escriba.web.services.ControlesseguimientoService;

public class ControlesseguimientoServiceImpl implements ControlesseguimientoService{

  private ControlesseguimientoDAO controlesseguimientoDAO;
  private ControlesDAO controlesDAO;

  public void setControlesseguimientoDAO(ControlesseguimientoDAO controlesseguimientoDAO) {
    this.controlesseguimientoDAO = controlesseguimientoDAO;
  }
  
  public void setControlesDAO(ControlesDAO controlesDAO) {
	  this.controlesDAO = controlesDAO;
  }

  @Override
  public List<ControlesseguimientoDTO> listControlesseguimiento(InvocationContext ic) throws ServiceException {
    List<ControlesseguimientoDTO> controlesseguimientos =  controlesseguimientoDAO.listControlesseguimiento();

    return controlesseguimientos;
  }
  @Override
  public List<ControlesseguimientoDTO> listControlesseguimientoByIdControl(Long id, InvocationContext ic) throws ServiceException {
	if (id == null || id <= 0)
	      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");
	
    List<ControlesseguimientoDTO> controlesseguimientos =  controlesseguimientoDAO.listControlesseguimientoByIdControl(id);
    return controlesseguimientos;
  }
  
  @Override
  public ControlesseguimientoDTO getControlesseguimiento(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    ControlesseguimientoDTO controlesseguimiento =  controlesseguimientoDAO.getControlesseguimientoById(id);

    if (controlesseguimiento == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"controlesseguimiento.notfound", id);

    return controlesseguimiento;
  }

  @Override
  public void deleteControlesseguimiento(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    ControlesseguimientoDTO controlesseguimiento =  controlesseguimientoDAO.getControlesseguimientoById(id);

    if(controlesseguimiento == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"controlesseguimiento.notfound", id);

    try {
      controlesseguimientoDAO.deleteControlesseguimiento(controlesseguimiento);
    }
    catch (DataIntegrityViolationException e){
      throw new ServiceException(ErrorCode.DATA_INTEGRITY_VIOLATION, "controlesseguimiento.constraint.violation", id);
    }

  }

  @Override
  public ControlesseguimientoDTO updateControlesseguimiento(Long id, ControlesseguimientoDTO dto, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    if (null == dto)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");
    
    ControlesDTO c =  controlesDAO.getControlesById(dto.getIdcontrol());

	if (c == null)
		throw new ServiceException(ErrorCode.NO_DATA_FOUND,"controles.not.exist", id);	

    ControlesseguimientoDTO controlesseguimiento = controlesseguimientoDAO.getControlesseguimientoById(id);

    if (controlesseguimiento == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"controlesseguimiento.notfound", id);

    controlesseguimiento.setIdcontrol(dto.getIdcontrol());
    controlesseguimiento.setFecha(dto.getFecha());
    controlesseguimiento.setTexto(dto.getTexto());
    controlesseguimiento.setIdusuario(dto.getIdusuario());
    controlesseguimiento.setFechacreacion(dto.getFechacreacion());
    controlesseguimiento.setIdusuariomodificacion(dto.getIdusuariomodificacion());
    controlesseguimiento.setFechamodificacion(new Date());
 
    Utils.validarDTO(dto);

    controlesseguimientoDAO.updateControlesseguimiento(controlesseguimiento);
    
    c.setFechamodificacion(new Date(System.currentTimeMillis()));
	c.setIdusuariomodificacion(ic.getIdUserPrincipal());
	controlesDAO.updateControles(c);

    return controlesseguimiento;
  }

  @Override
  public ControlesseguimientoDTO createControlesseguimiento(ControlesseguimientoDTO dto, InvocationContext ic) throws ServiceException {
    if (dto == null)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    try {

      Utils.validarDTO(dto);
      dto.setFecha(new Date());
      dto.setFechacreacion(new Date());
      dto.setFechamodificacion(new Date());
      controlesseguimientoDAO.createControlesseguimiento(dto);
    }
    catch (DuplicateKeyException e){
      throw new ServiceException(ErrorCode.DUPLICATE_KEY_EXCEPTION, "controlesseguimiento.duplicate.key");
    }

    return dto;
  }

}